perm filename FUNC.F4[FOO,MUS] blob
sn#007297 filedate 1972-11-04 generic text, type T, neo UTF8
00100 C THIS PROGRAM CREATES FUNCTIONS FOR THE MUSIC PROGRAM USING 'SEG' OR 'SYNTH'.
00200 C UP TO 10 FUNCTIONS CAN BE STORED IN A SINGLE FILE. ONCE CREATED THE
00300 C FUNCTIONS MAY BE CHANGED AND PUT BACK IN THE SAME FILE OR INTO A NEW ONE.
00400
00500 DIMENSION FUNC(512),A(50,4),B(21)
00600 COMMON ST(30),SU(270),K,I,IY
00700 DATA FAC/0.703125/
00800 C FAC=360./512.
00900 40 FORMAT(11(A1,A3))
01000 41 FORMAT(' ADD TO AN EXISTING FILE?'/)
01100 42 FORMAT(' WHICH FUNC?'/)
01200 43 FORMAT(' NO ROOM IN FILE "',A5,'.DAT"')
01300 44 FORMAT(' FUNCTIONS ALREADY IN FILE.')
01400 45 FORMAT('(512);')
01500 27 FORMAT(' 0=FIN, 1=REDEF'/)
01600 26 FORMAT(' TYPE AMPL, STEP#'/)
01700 25 FORMAT(' TYPE FILE NAME'/)
01800 24 FORMAT(' TYPE FUNCTION NAME'/)
01900 23 FORMAT(' SEG OR SYNTH?'/)
02000 22 FORMAT(' NEW FUNC, OLD OR DELETE ONE?'/)
02100 21 FORMAT(' CHANGE FUNC OR EXIT?'/)
02200 28 FORMAT(' -1=CLR,0=NORM,OR H,A,P,K'/)
02300 280 FORMAT(' THIS IS A NEW FORM OF ''FUNC'''/
02400 1' SEG USES 100 STEPS IN THIS PROGRAM!'/
02500 1' UP TO 10 FUNCTIONS MAY BE STORED IN EACH FILE'/
02600 1' (TYPE ''99'' TO BACKUP.)'/)
02700 30 FORMAT(8F)
02800 31 FORMAT(1XA5,A1,5A5/)
02900 CC32 FORMAT(9A1)
03000 CC33 FORMAT(7A5)
03100 34 FORMAT(A5,'(',A5,');',A5)
03200 35 FORMAT(1XA5,'IN FILE "',A5,'.DAT"'/)
03300 36 FORMAT(/' DELETE FOR20.DAT'/)
03400 37 FORMAT(8F9.3)
03500 38 FORMAT(2(A5,A1),23A2)
03600 39 FORMAT(A5,A1,10(A3,A1))
03700 TYPE 280
03800 281 KZ=0
03900 Z=0
04000 CC Y='('
04100 CC H=')'
04200 CALL FUNCT(FUNC)
04300 TYPE 22
04400 215 CALL DPYSET(1,ST,30)
04500 CALL DPYBRT(1)
04600 ACCEPT 40,ON
04700 IF(ON.EQ.'N')GO TO 100
04800 TYPE 25
04900 ACCEPT 39,FLNM
05000 REWIND 1
05100 CALL IFILE(1,FLNM)
05200 READ (1,39),X,B
05300 IF(B(3).EQ.' ')GO TO 402
05400 TYPE 40,B
05500 TYPE 42
05600 ACCEPT 39,FNUM
05700 IF(FNUM.EQ.'99')GO TO 281
05800 IF(ON.EQ.'D')GO TO 922
05900 CC IF(FNUM.EQ.B(2))GO TO 151
06000 402 READ (1,39),K
06100 401 READ(1,38)X,Y,FNX,H
06200 IF(FNX.EQ.FNUM.OR.B(3).EQ.' ')GO TO 151
06300 GO TO 401
06400 151 TYPE 31,X,Y,FNX,H
06500 Z=-1.
06600 IF(X.EQ.'SEG')GO TO 802
06700 EY=0
06800 IF(Z)GO TO 1031
06900 100 TYPE 23
07000 ACCEPT 40,X,EY
07100 1032 CALL FUNCT(FUNC)
07200 C CLEARS THE FUNC.
07300 IF(EY.EQ.'EG')GO TO 802
07400 1031 CALL ALINE(-160,0,356,0)
07500 CALL ALINE(-156,-256,-156,256)
07600 CALL DPYOUT(1)
07700 15 KT=1
07800 104 IF(Z)GO TO 103
07900 IF(KT.LT.KZ)GO TO 102
08000 KZ=0
08100 TYPE 28
08200 ACCEPT 30,(A(KT,K),K=1,4)
08300 GO TO 102
08400 CC115 CALL HYDPOG(2)
08500 115 CALL DPYSET(2,SU,270)
08600 CALL DPYBRT(6)
08700 CALL FUNCT(FUNC)
08800 GO TO 15
08900 1051 CALL DPYCLR
09000 105 KT=KT-1
09100 IF(KT.LT.1)GO TO 281
09200 KZ=KT
09300 GO TO 1032
09400 C CLEARS ARRAY
09500 103 READ(1,30)(A(KT,K),K=1,4)
09600 102 H=A(KT,1)
09700 IF(H.EQ.0.OR.H.EQ.999.)GO TO 2200 CALL ALINE(-160,0,356,0)
07500 CALL ALINE(-156,-256,-156,256)
07600 CALL DPYOUT(1)
07700 15 KT=1
07800 104 IF(Z)GO TO 103
07900 IF(KT.LT.KZ)GO TO 102
08000 KZ=0
08100 TYPE 28
08200 ACCEPT 30,(A(KT,K),K=1,4)
08300 GO TO 102
08400 CC115 CALL HYDPOG(2)
08500 115 CALL DPYSET(2,SU,270)
08600 CALL DPYBRT(6)
08700 CALL FUNCT(FUNC)
08800 GO TO 15
08900 1051 CALL DPYCLR
09000 105 KT=KT-1
09100 IF(KT.LT.1)GO TO 281
09200 KZ=KT
09300 GO TO 1032
09400 C CLEARS ARRAY
09500 103 READ(1,30)(A(KT,K),K=1,4)
09600 102 H=A(KT,1)
09700 IF(H.EQ.0.OR.H.EQ.999.)GO TO 2200
09800 IF(H)GO TO 115
09900 IF(H.EQ.99.)GO TO 105
10000 AMP=A(KT,2)
10100 PH=A(KT,3)
10200 CON=A(KT,4)
10300 X=PH*512./360.+1.0
10400 C PHASE IS IN DEGREES (0 - 360)
10500 2016 DO 17 K=1,512
10600 XK=SIND(X*FAC)*AMP+CON
10700 IF(CON.LT.100.0)GO TO 1
10800 FUNC(K)=(XK-100.)*FUNC(K)
10900 GO TO 2
11000 1 FUNC(K)=FUNC(K)+XK
11100 2 X=X+H
11200 17 IF(X.GT.512.)X=X-512.
11300 KT=KT+1
11400 IF(KZ.LE.KT)CALL DPY(FUNC)
11500 GO TO 104
11600 2200 X=FUNC(1)
11700 DO 19 K=2,512
11800 XK=ABS(FUNC(K))
11900 19 IF(X.LT.XK)X=XK
12000 DO 20 K=1,512
12100 20 FUNC(K)=FUNC(K)/X
12200 CALL DPY(FUNC)
12300 200 IF(Z.EQ.0)GO TO 4200
12400 TYPE 21
12500 C CHANGE IT?
12600 ACCEPT 40,Z
12700 IF(Z.EQ.'E')CALL EXIT
12800 Z=0
12900 DO 101 K=1,512
13000 101 FUNC(K)=FUNC(K)*X
13100 C TO MAKE RESULT ALWAYS HONEST.
13200 GO TO 104
13300 4200 IF(EY.EQ.'EG')GO TO 7
13400 TYPE 27
13500 C FINISH SYNTH
13600 ACCEPT 30,X
13700 IF(X.NE.0.0)GO TO 1032
13800 900 TYPE 41
13900 C ADD TO EXISTING FILE
14000 ISKP=0
14100 ACCEPT 40,Z
14200 IF(Z.EQ.' '.OR.Z.EQ.'9')GO TO 4200
14300 TYPE 25
14400 ACCEPT 39,FLNM
14500 IF(FLNM.EQ.'99'.OR.FLNM.EQ.' ')GO TO 4200
14600 IF(Z.EQ.'N')GO TO 911
14700 REWIND 1
14800 CALL IFILE(1,FLNM)
14900 READ(1,39),X,B
15000 TYPE 44
15100 C FUNCS. IN FILE
15200 TYPE 40,B
15300 922 REWIND 20
15400 WRITE(20,39),X,B
15500 READ (1,38),X,Y
15600 CC WRITE(20,38),X,Y
15700 IF(ON.NE.'D')GO TO 911
15800 90 READ(1,38,END=92)X,Y,FNX,B
15900 IF(ISKP.AND.X.NE.'SEG'.AND.X.NE.'SYNTH')GO TO 90
16000 ISKP=0
16100 IF(FNX.EQ.FNUM)GO TO 921
16200 WRITE(20,38)X,Y,FNX,B
16300 GO TO 90
16400 921 ISKP=-1
16500 GO TO 90
16600 C WRITES TEMPORARY FILE 'FOR20.DAT'.
16700 92 END FILE 20
16800 CC CALL OFILE(1,FLNM)
16900 REWIND 20
17000 READ(20,39),X,B
17100 DO 93 K=2,20
17200 X=B(K)
17300 IF(X.NE.' ')GO TO 931
17400 B(K)=','
17500 B(K+1)=FNUM
17600 GO TO 94
17700 931 IF(X.NE.FNUM)GO TO 93
17800 IF(ON.EQ.'D')FNUM=' '
17900 DO 932 L=K,20
18000 B(L)=B(L+2)
18100 IF(B(L).NE.' ')GO TO 932
18200 IF(B(L+1).EQ.' ')GO TO 941
18300 C NO COMMA=LAST ITEM
18400 IF(FNUM.NE.' ')B(L)=','
18500 B(L+1)=FNUM
18600 CC IF(B(L-1).EQ.',')B(L-1)=' '
18700 C TO DELETE LAST ','
18800 GO TO 94
18900 941 B(L)=FNUM
19000 GO TO 94
19100 932 CONTINUE
19200 B(20)=FNUM
19300 B(19)=','
19400 IF(FNUM.EQ.' ')B(19)=FNUM
19500 C REPLACES LAST ITEM IN FILE.
19600 GO TO 94
19700 93 CONTINUE
19800 TYPE 43,FLNM
19900 C NO ROOM IN FILE.
20000 TYPE 40,B
20100 GO TO 900
20200 911 TYPE 24
20300 C FUNCTION NAME
20400 ACCEPT 39,FNUM
20500 IF(FNUM.EQ.'99'.OR.FNUM.EQ.' ')GO TO 900
20600 IF(Z.NE.'N')GO TO 90
20700 DO 9001 K=1,21
20800 9001 B(K)=' '
20900 B(2)=FNUM
21000 94 DO 942 K=19,3,-2
21100 IF(B(K).EQ.' ')GO TO 942
21200 IF(B(K+1).EQ.' ')B(K)=' '
21300 GO TO 943
21400 942 CONTINUE
21500 C DELETES ANY TRAILING COMMA
21600 943 REWIND 1
21700 CALL OFILE(1,FLNM)
21800 X='ARRAY'
21900 WRITE(1,39),X,B
22000 WRITE(1,45)
22100 IF(Z.EQ.'N')GO TO 97
22200 95 READ(20,38,END=96)B
22300 WRITE(1,38)B
22400 GO TO 95
22500 96 IF(ON.EQ.'D')CALL EXIT
22600 CC96 IF(ON.EQ.'D')GO TO 904
22700 97 X='SYNTH'
22800 J=4
22900 Y=' 99'
23000 IF(EY.NE.'EG')GO TO 901
23100 J=2
23200 X='SEG '
23300 Y=' '
23400 901 WRITE(1,34),X,FNUM,Y
23500 903 DO 902 K=1,KT-1
23600 902 WRITE(1,37)(A(K,L),L=1,J)
23700 IF(A(KT-1,2).GT.512.)GO TO 950
23800 IF(EY.EQ.'EG'21500 C DELETES ANY TRAILING COMMA
21600 943 REWIND 1
21700 CALL OFILE(1,FLNM)
21800 X='ARRAY'
21900 WRITE(1,39),X,B
22000 WRITE(1,45)
22100 IF(Z.EQ.'N')GO TO 97
22200 95 READ(20,38,END=96)B
22300 WRITE(1,38)B
22400 GO TO 95
22500 96 IF(ON.EQ.'D')CALL EXIT
22600 CC96 IF(ON.EQ.'D')GO TO 904
22700 97 X='SYNTH'
22800 J=4
22900 Y=' 99'
23000 IF(EY.NE.'EG')GO TO 901
23100 J=2
23200 X='SEG '
23300 Y=' '
23400 901 WRITE(1,34),X,FNUM,Y
23500 903 DO 902 K=1,KT-1
23600 902 WRITE(1,37)(A(K,L),L=1,J)
23700 IF(A(KT-1,2).GT.512.)GO TO 950
23800 IF(EY.EQ.'EG')GO TO 904
23900 X=999.
24000 WRITE(1,37)X
24100 CC904 END FILE 1
24200 904 TYPE 35,FNUM,FLNM
24300 IF(Z.NE.'N')TYPE 36
24400 CALL EXIT
24500
24600 CC950 WRITE(1,34),X,FNUM
24700 CC X=99.00
24800 CC WRITE(1,37),X
24900 950 DO 951 K=1,512,4
25000 951 WRITE(1,37),(FUNC(J),J=K,K+3)
25100 GO TO 904
25200
25300 801 READ(1,30)AMP,STEP
25400 CC ICURVE=STEP/5.120+.2
25500 ICURVE=STEP
25600 CC IF(STEP.GT.512.)STEP=512.
25700 IF(STEP.GT.100.)STEP=100.
25800 GO TO 506
25900 802 CALL DPYSET(1,ST,30)
26000 CALL DPYBRT(1)
26100 KT=1
26200 800 ST(1)=0.0
26300 DO 501 K=-256,256,128
26400 IF(K.EQ.0)GO TO 501
26500 CALL ALINE(-160,K,356,K)
26600 501 CONTINUE
26700 DO 502 K=-156,356,128
26800 502 CALL ALINE(K,-260,K,256)
26900 CALL ALINE(-160,0,356,0)
27000 CALL DPYOUT(1)
27100 EY='EG'
27200 X=0
27300 Y=0
27400 KT=1
27500 N=-156
27600 CALL DPY(FUNC)
27700 701 CALL HYDPOG(2)
27800 CALL DPYSET(2,SU,270)
27900 CALL DPYBRT(5)
28000 CC CALL AIVECT(-256,0)
28100 CALL FUNCT(FUNC)
28200 504 IF(Z)GO TO 801
28300 IF(KT.GE.KZ)GO TO 507
28400 AMP=A(KT,1)
28500 STEP=A(KT,2)
28600 CC ICURVE=STEP/5.12+.2
28700 ICURVE=STEP
28800 GO TO 506
28900 507 TYPE 26
29000 KZ=0
29100 ACCEPT 30,AMP,STEP
29200 5071 ICURVE=STEP+.2
29300 IF(STEP.GT.100)STEP=100
29400 CC JSTP=STEP*5.12+.001
29500 CC STEP=JSTP
29600 CC STEP=IFIX(STEP*5.12+.001)
29700 508 IF(AMP.NE.99..AND.STEP.GE.0)GO TO 506
29800 509 KT=KT-1
29900 IF(KT.LT.1)GO TO 281
30000 KZ=KT
30100 C DOES NOT WORK YET. TYPE 99 FOR 'AMP' OR -1 FOR 'STEP#' TO ERASE LAST ITEM.
30200 CALL CLRPOG(2)
30300 GO TO 802
30400 506 IT=X
30500 DIF=AMP-Y
30600 STPS=STEP-X
30700 IF(STPS.LE.0.AND.KT.NE.1)GO TO 504
30800 C CANNOT BACKUP UNLESS YOU TYPE 99 FOR AMP. OR -1 FOR STEP.
30900 IS=STPS
31000 DO 2031 K=1,IS
31100 RK=K
31200 2031 FUNC(K+IT)=Y+DIF*RK/STPS
31300 IF(STEP.LE.1.)GO TO 12
31400 203 JX=X*5.120
31500 KX=STEP*5.120
31600 I=AMP*256.
31700 IZ=Y*256.
31800 CALL ALINE(N+JX,IZ,N+KX,I)
31900 CALL DPYOUT(2)
32000 12 Y=AMP
32100 X=STEP
32200 A(KT,1)=Y
32300 A(KT,2)=X
32400 IF(ICURVE.GT.100)GO TO 7000
32500 7001 KT=KT+1
32600 CC IF(STEP.LT.512.)GO TO 504
32700 CC IF(STEP-512.)504,7,7000
32800 IF(STEP-100.)504,7,7000
32900 7 TYPE 27
33000 ACCEPT 30,X
33100 Z=0
33200 IF(X.EQ.99.)GO TO 509
33300 C X=-1 CHANGES LAST ENTRY.
33400 IF(X.EQ.1)GO TO 802
33500 GO TO 900
33600
33700 7000 CALL SSS(A,KT,FUNC)
33800 CALL DPY(FUNC)
33900 A(KT,2)=520
34000 GO TO 7001
34100 END
34200
34300 SUBROUTINE FUNCT(FUNC)
34400 DIMENSION FUNC(1)
34500 DO 1 K=1,512
34600 1 FUNC(K)=0
34700 RETURN
34800 END
34900
35000 C ********** DISPLAY OUTPUT **********
35100 SUBROUTINE DPY(FUNC)
35200 COMMON ST(30),SU(270),K,I,IY
35300 DIMENSION FUNC(1)
35400 2 CALL DPYSET(2,SU,270)
35500 CALL DPYBRT(5)
35600 CC CALL AIVECT(0,0)
35700 IY=FUNC(1)*256.0
35800 CALL AIVECT(-156,IY)
35900 DO 1017 K=2,512
36000 I=FUNC(K)*256.0
36100 CALL SVECT(1,I-IY)
36200 1017 IY=I
36300 CALL DPYOUT(2)
36400 RETURN
36500 END